"""
十大歌神
NZD正在进行“十大歌神”评选，全校学生可以投票选出他们最喜欢的歌神。
编写一个程序来模拟这个投票和统计过程。
首先，使用random的方式生成100个人名（可以是中英文），然后用random的方法随机抽取这些人名填充到长度为1000的列表中，模拟1000次投票。
最后，程序应统计出十大歌神，并特别打印出冠军的名字和所得票数。
"""

import random


def get_one_name():
    """
    生成一个人名
    5个字母
    """
    name = ''
    for i in range(5):
        n = random.choice('abcdefghijklmnopqrstuvwxyz')
        name += n
    name = name.title()     # 首字母大写
    return name


def generate_names(num=100):
    """
    生成 num 个人名
    """
    names = []      # 装在列表里
    for i in range(num):
        name = get_one_name()
        names.append(name)      # 添加新人名到列表内
    return names


def get_max(dic):
    """
    在字典中找到 value 最大的键值对
    """
    top1_name = "zhangsan"
    top1_vote = 0
    for k, v in dic.items():
        if v > top1_vote:
            top1_name = k
            top1_vote = v
    return top1_name, top1_vote


def NZD_top_singers():
    names = generate_names(100)  # 生成100个人名

    # 计算投票逻辑
    dic = {}
    for i in range(10000):
        name = random.choice(names)        # 从 100 人中选一个
        if name in dic:
            dic[name] = dic.get(name) + 1
        else:
            dic[name] = 1

    # 取出冠军
    top1_name, top1_value = get_max(dic)        # 同时用两个变量接收返回的两个值
    print(f"第1名是：{top1_name}，得票：{top1_value}")

    dic.pop(top1_name)  # 弹出已找到的最大的键值对

    for i in range(2, 11):   # 2 - 10
        top2_name, top2_value = get_max(dic)  # 同时用两个变量接收返回的两个值
        print(f"第{i}名是：{top2_name}，得票：{top2_value}")
        dic.pop(top2_name)  # 弹出已找到的最大的键值对



if __name__ == '__main__':
    NZD_top_singers()
